home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / mail / mh / contrib / jpeek / mhlinks < prev    next >
Text File  |  1992-08-08  |  4KB  |  122 lines

  1. #! /bin/sh
  2. # ^^^ SHELL SHOULD HAVE BUILT-IN echo FOR SPEED
  3. # $Header: /home/jerry/.bin/RCS/mhlinks,v 1.4 92/08/09 23:26:32 jerry mh_contrib $
  4. ###    mhlinks - find MH message(s) in all folders linked to named message(s)
  5. ###    Usage: mhlinks [folder] [msgs]
  6. ##
  7. ##    mhlinks SEARCHES THROUGH A DATABASE OF ALL YOUR MH MESSAGES.  IT LISTS
  8. ##    THE MESSAGE NUMBERS LINKED TO THE CURRENT MESSAGE OR TO THE MESSAGE(S)
  9. ##    YOU NAME ON THE COMMAND LINE.  THE DATABASE IS BUILD EVERY NIGHT
  10. ##    (OR HOWEVER OFTEN YOU DO IT) BY THE PROGRAM mhlinks.build.
  11. ##
  12. ##    USE THIS SCRIPT TO FIND ALL THE LINKS TO A MESSAGE YOU NEED TO
  13. ##    REMOVE... OR FOR ANY REASON YOU NEED TO FIND ALL THE LINKS.
  14. ##    THIS SCRIPT ISN'T FOOLPROOF; IF A MESSAGE HAS BEEN REPLACED RECENTLY,
  15. ##    OR IF YOU'VE CHANGED THE LINKS, USE THE scanlinks SCRIPT INSTEAD.
  16. ##    THIS SCRIPT WILL TRY TO WARN YOU WHEN THAT'S A PROBLEM.
  17.  
  18. #    TABSTOPS IN THIS CODE SET AT 4
  19. #
  20. #    USE AT YOUR OWN RISK.  SEEMS TO WORK, BUT IT'S YOUR RESPONSIBILITY!
  21. #    PLEASE TELL ME ABOUT BUGS AND FIXES: Jerry Peek, jerry@ora.com
  22.  
  23. builder=mhlinks.build    # PROGRAM THAT BUILDS $db FILE FROM at OR cron
  24. current=scanlinks        # PROGRAM THAT SEARCHES $mhdir, NOT $db
  25.  
  26. filelist=/tmp/MHLINKf$$                        # UNCOMPRESSED $db FILE
  27. folopts="-nolist -nototal -nopack -fast"    # OVERRIDE MH PROFILE
  28. mh=/usr/local/mh                            # WHERE MH PROGRAMS LIVE
  29. mhdir="`$mh/mhpath +`" || exit 1            # USER'S MH MAIL DIRECTORY
  30. myname="`basename $0`"                        # NAME OF THIS PROGRAM
  31. scanopts="-noclear -noheader -noreverse"    # OVERRIDE MH PROFILE
  32. search=/home/jerry/.bin/bm                    # FAST SEARCH (OR JUST USE grep)
  33. smsglist=/tmp/MHLINKm$$                        # MESSAGE(S) WE WANT TO FIND
  34. stat=1                # DEFAULT EXIT STATUS; SET TO 0 BEFORE NORMAL EXIT
  35. zcat=/usr/ucb/zcat                            # UNCOMPRESSES $db FILE
  36.  
  37. umask 077                                    # MAKE TEMP FILES PRIVATE
  38. trap 'rm -f $filelist $smsglist; exit $stat' 0 1 2 15
  39.  
  40. # MESSAGE DATABASE FILE WITH LINES THAT LIST EACH I-NUMBER AND
  41. # MESSAGE(S) WITH THAT I-NUMBER... LIKE THIS:
  42. # 123 a/234 prog/c/14
  43. # 127 a/453 misc/24 reports/17 
  44. # EACH LINE ENDS WITH A SPACE.  SO, EACH MESSAGE HAS SPACES AROUND IT.
  45. db=$mhdir/mhlinks.list.Z
  46. $zcat $db > $filelist || {
  47.     echo 1>&2 "$myname: can't read database '$db'.
  48.         Be sure '$builder' script is running from 'cron'."
  49.     exit 1
  50. }
  51.  
  52. while :
  53. do
  54.     case "$1" in
  55.     "")    break ;;
  56.     [+@]*) sfolder="$1" ;;    # "SOURCE" FOLDER (LOOK FOR LINKS FROM HERE)
  57.     -*)    echo "$myname: warning: ignoring '$1'." 1>&2 ;;
  58.     *)    smsgargs="$smsgargs $1" ;;    # "SOURCE" MESSAGES
  59.     esac
  60.  
  61.     shift
  62. done
  63.  
  64. # DON'T JUST DO folder +xxxx; IF FOLDER DOESN'T EXIST, IT'LL ASK create?
  65. # IF sfolder WASN'T SET ON COMMAND LINE, DEFAULTS TO CURRENT FOLDER.
  66. # NOTE: NEW MH 6.7.2 %(folder) ESCAPE FOR scan MIGHT REPLACE sfolname= LINE:
  67. sfolpath=`$mh/mhpath $sfolder`
  68. if [ $? -ne 0 -o \( ! -d "$sfolpath" \) ]
  69. then echo "$myname: quitting: missing '$sfolder'?" 1>&2; exit
  70. else sfolname="`$mh/folder $folopts $sfolder`" || exit
  71. fi
  72.  
  73. if mhdir="`$mh/mhpath +`"
  74. then
  75.     cd $mhdir || exit
  76. else
  77.     echo "$myname: quitting: problem with MH directory." 1>&2
  78.     exit
  79. fi
  80.  
  81. # IF NO MESSAGES NAMED ON COMMAND LINE, USE CURRENT MESSAGE IN FOLDER.
  82. # STRIP OFF $mhdir PATH; ADD SINGLE SPACE AT START AND END, LIKE:
  83. #  inbox/23
  84. $mh/scan $scanopts -format "${sfolname}/%(msg)" ${smsgargs=cur} > $smsglist || exit
  85.  
  86. # QUICK HACK.  CAN WE BE MORE EFFICIENT FOR LOTS OF MESSAGES
  87. # BY MAKING A PATTERN FILE FOR fgrep, sed, ETC?
  88. for file in `cat $smsglist`
  89. do
  90.     # LIST MESSAGE; inum GOES INTO $2, FILENAMES INTO $3 ON.
  91.     # SPACES AROUND NAME MAKE SURE NO OTHER MESSAGES ARE MATCHED:
  92.     set x `$search " $file " $filelist`
  93.     case $# in
  94.     1)    echo 1>&2 "$myname: can't find '$file' in database.
  95.         Try '$current' program instead."
  96.         ;;
  97.     *)    # COMPARE LAST-INODE-MODIFIED TIME OF DATABASE TO THE MESSAGE.
  98.         # IF THE MESSAGE COMES FIRST, WARN USER.
  99.         # THIS COULD BE DONE FASTER, ESPECIALLY FOR LONG $smsglist!
  100.         case "`/bin/ls -cdt $db $file`" in
  101.         ${db}*)    ;;
  102.         *)    echo "$myname: WARNING: database entry for $file may be old.
  103.             Try '$current' program instead." 1>&2
  104.             ;;
  105.         esac
  106.         # STEP THROUGH MESSAGES, ARRANGE LIST STARTING WITH $file:
  107.         out=
  108.         shift; shift    # GET RID OF x AND I-NUMBER
  109.         for arg    
  110.         do
  111.             case "$arg" in
  112.             $file)    ;;
  113.             *)    out="$out $arg" ;;
  114.             esac
  115.         done
  116.         echo $file $out
  117.         ;;
  118.     esac
  119. done
  120. stat=0    # SORT OF PRESUMPTUOUS
  121. exit
  122.